/*
  学习目标：函数类型
  作用：为函数的参数和返回值指定类型
*/

// 第一种写法：分别为参数、返回值，指定类型
// 普通函数
function addFn(a: number, b: number): number {
  return a + b;
}

addFn(1, 2);
addFn(1, '2'); // 报错
// 箭头函数
const addFn2 = (a: number, b: string): string => {
  return a + b;
};
addFn2(1, '2');
addFn2(1, 2); // 报错

// 第二种写法：同时指定参数、返回值的类型
type AddFn = (num1: number, num2: number) => number;
type AddFn2 = (num: number, str: string) => string;

const arrAddFn: AddFn = (n1, n2) => {
  return n1 + n2;
};

const arrAddStrFn: AddFn2 = (num, str) => {
  return num + str;
};

// 同时指定参数、返回值类型的写法，只适用于表达式函数。
// ❌下方 是不支持这种写法，
// function addFn3: AddFn2(){}

// 👎不推荐的写法，不利于阅读
const arrAddStrFn2: (num: number, str: string) => string = (num, str) => {
  return num + str;
};
